﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SeguroSoft.Model.Model;

namespace SeguroSoft.Models
{
    public class RepositorioServicioTecnico : SeguroSoft.Models.IRepositorioServicioTecnico
    {
        SeguroSoftDBDataContext db = new SeguroSoftDBDataContext();

        //Métodos de Consulta


        /// <summary>
        /// Devuelve todos los Servicios Técnicos en la base de datos
        /// </summary>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarTodosServiciosTecnicos()
        {
            return db.ServicioTecnicos;
        }


        /// <summary>
        /// Devuelve un Servicio Técnico específico de acuerdo a su ID
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ServicioTecnico ObtenerServicioTecnico(int id)
        {
            return db.ServicioTecnicos.SingleOrDefault(d => d.IDServicioTecnico == id);
        }


        /// <summary>
        /// Devuelve el Servicio Técnico según el tipo de bencina que el vehículo use.
        /// </summary>
        /// <param name="tipoBencina"></param>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorTipoBencina(string tipoBencina)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.TipoBencina.Equals(tipoBencina)
                   orderby servicioTecnico.TipoBencina
                   select servicioTecnico;
        }


        /// <summary>
        /// Devuelve el Servicio Técnico según el kilometraje del vehículo.
        /// </summary>
        /// <param name="km"></param>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorKilometraje(string km)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Km.Equals(km)
                   orderby servicioTecnico.Km
                   select servicioTecnico;
        }


        /// <summary>
        /// Devuelve el Servicio Técnico según el año del vehículo.
        /// </summary>
        /// <param name="año"></param>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorAño(string año)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Año.Equals(año)
                   orderby servicioTecnico.Año
                   select servicioTecnico;
        }


        /// <summary>
        /// Devuelve el Servicio Técnico según el modelo del vehículo.
        /// </summary>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorModelo(string modelo)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Modelo.Equals(modelo)
                   orderby servicioTecnico.Modelo
                   select servicioTecnico;
        }


        /// <summary>
        /// Devuelve el Servicio Técnico según la marca del vehículo.
        /// </summary>
        /// <param name="marca"></param>
        /// <returns></returns>
        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorMarca(string marca)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Marca.Equals(marca)
                   orderby servicioTecnico.Marca
                   select servicioTecnico;
        }

        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPorMotor(string motor)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Motor.Equals(motor)
                   orderby servicioTecnico.Motor
                   select servicioTecnico;
        }

        /// <summary>
        /// Elimina un Servicio Técnico de la Base de Datos
        /// </summary>
        /// <param name="seguro"></param>
        public void EliminarServicioTecnico(ServicioTecnico servicioTecnico)
        {
            db.ServicioTecnicos.DeleteOnSubmit(servicioTecnico);
        }

        /// <summary>
        /// Guarda los cambios en la base de datos.
        /// </summary>
        public void Guardar()
        {
            db.SubmitChanges();
        }

        public IQueryable<ServicioTecnico> EncontrarServicioTecnicoPor(string marca, string modelo, string año, string km, string tipoDeBencina)
        {
            return from servicioTecnico in db.ServicioTecnicos
                   where servicioTecnico.Marca.Equals(marca) & servicioTecnico.Año.Equals(año) & servicioTecnico.Modelo.Equals(modelo) & servicioTecnico.Km.Equals(km) & servicioTecnico.TipoBencina.Equals(tipoDeBencina)
                   orderby servicioTecnico.Costo
                   select servicioTecnico;
        }

        public List<Comentario> EntontrarComentarioServicio(int id)
        {
            IQueryable<int> idcomentarios = from tist in db.TISTs
                                            where tist.IDServicioTecnico == id
                                            select tist.IDComentario;
            List<Comentario> comentarios = new List<Comentario>();
            foreach (int idcomentario in idcomentarios)
            {
                IQueryable<Comentario> aux = from comentario in db.Comentarios
                                             where comentario.IDComentario == idcomentario
                                             select comentario;
                comentarios.AddRange(aux.ToList());
            }
            return comentarios;
        }

        public void crearTist(TIST tist)
        {
            db.TISTs.InsertOnSubmit(tist);
            this.Guardar();
        }



    }
}